/**
 * @Author: Jiang Zhongxun
 * @Date: 2024-10-03 22:48:41
 * @FilePath: /Socket/practiceProject/include/db/dbDefinition.h
 * @Description: SQLite3数据库定义相关
 */
#ifndef _DBHANDLE_H_
#define _DBHANDLE_H_

#include <arpa/inet.h>
#include <errno.h>
#include <fcntl.h>
#include <netinet/in.h>
#include <sqlite3.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/un.h>
#include <sys/wait.h>
#include <unistd.h>

#define DATABASE_NAME "customs_inspection.db"                               // 数据库名称
#define DATABASE_PATH "/home/linux/Desktop/24072/Socket/practiceProject/db" // 数据路文件所在路径
#define USER_TABLE_NAME "user_info"                                         // 用户信息表名称
#define LOG_TABLE_NAME "log_info"                                           // 日志信息表名称
#define CHECK_TABLE_NAME "check_info"                                       // 查验记录信息表名称

/* 是否删除类型枚举 */
typedef enum
{
    DELETE_NO = 0,  // 未删除
    DELETE_YES = 1, // 已删除
} IsDelete;

/* 用户类型枚举 */
typedef enum
{
    ADMIN = 0,  // 管理员
    NORMAL = 1, // 普通用户
} UserType;

/* 用户信息表字段结构体 */
typedef struct
{
    int userId;        // 用户ID
    char userName[20]; // 用户名称
    char passwd[20];   // 用户密码
    UserType userType; // 用户类型，区分管理员与普通用户
    IsDelete isDelete; // 是否删除
} UserInfo;

/* 日志类型枚举 */
typedef enum
{
    SYSTEMLOG = 0,  // 系统日志
    OPERATELOG = 1, // 操作日志
} LogType;

/* 日志信息表字段结构体 */
typedef struct
{
    int logId;         // 日志编号
    char logMsg[128];  // 日志信息内容
    LogType logType;   // 日志类型，区分系统日志与用户操作日志
    IsDelete isDelete; // 是否删除
} LogInfo;

/* 查验记录状态枚举 */
typedef enum
{
    NOTCHECKED = 0,  // 未查验
    CHECKED = 1,     // 已查验
    CHECKFAILED = 2, // 已驳回
} CheckStatus;

/* 查验记录类型枚举 */
typedef enum
{
    SYSTEMCHECK = 0, // 系统自动查验
    MANUALCHECK = 1, // 人工手动查验
} CheckType;

/* 查验记录信息表字段结构体 */
typedef struct
{
    int checkId;             // 查验记录ID
    char checkItemName[50];  // 查验物品名称
    char applyUser[20];      // 申请人姓名
    char checker[20];        // 查验人员
    CheckStatus checkStatus; // 查验记录的状态
    CheckType checkType;     // 查验记录的类型，区分系统自动查验与人工手动查验
    IsDelete isDelete;       // 是否删除
} CHECKINFO;

/* 创建数据库 */
sqlite3 *createDatabase(void);

/* 创建用户信息表 */
int createUserInfoTable(sqlite3 *db);

/* 创建日志信息表 */
int createLogInfoTable(sqlite3 *db);

/* 创建查验记录信息表 */
int createCheckInfoTable(sqlite3 *db);

/* 初始化数据库 */
sqlite3 *databaseInit(void);

#endif